1442: NASSA’s Robot
#include <iostream>
using namespace std;
int main()
{
int T;
cin >> T;
while(T--)
{
int x, y, n;
x = y = n = 0;
string s;
cin >> s;
for (int i = 0; i < s.size(); i++)
switch(s[i])
{
case 'U': y += 1; break;
case 'D': y -= 1; break;
case 'L': x -= 1; break;
case 'R': x += 1; break;
case '?': n += 1; break;
}
printf("%d %d %d %d\n", x-n, y-n, x+n, y+n);
}
return 0;
}
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
typedef long long ll;
using namespace std;
ll x, y, g;
void exgcd(ll a, ll b) {
if (b == 0) {
x = 1;
y = 0;
g = a;
return;
}
exgcd(b, a%b);
ll t = x;
x = y;
y = t - a / b * y;
return;
}
int main() {
int t;
ll n1, n2, f1, f2, d1, d2;
scanf("%d", &t);
while (t--) {
cin >> n1 >> f1 >> d1 >> n2 >> f2 >> d2;
ll f = f2 - f1;
exgcd(d1, -d2);
if (f % g) {
printf("0\n");
continue;
}
else {
ll r = abs((-d2)/g);
x = ((x * f / g) % r + r) % r;
y = (f - x * d1) / (-d2);
ll dx = abs(d1 / g);
ll dy = abs(d2 / g);
ll ans = min((n1 - 1 - x) / dy, (n2 - 1 - y) / dx) + 1;
cout << ans << endl;
}
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <iomanip>
#include <queue>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define inf 0x3f3f3f3f
#define P system("pause")
using namespace std;
#define M 105
int cost[105],val[105],n,m,L;
int p[105],g[M][M],dp[1005],dis[M],vis[M];
void DP()
{
for(int i=0;i<1005;i++)
dp[i]=inf;
dp[0]=0;
for(int i=0;i<m;i++)
{
for(int j=p[n-1]-p[0];j>=val[i];j--)
dp[j]=min(dp[j],dp[j-val[i]]+cost[i]);
}
}
void build()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g[i][j]=(p[i]==p[j])?0:inf;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(dp[p[j]-p[i]]<=L){
g[i][j]=g[j][i]=1;
}
}
}
}
int dij(int u)
{
int i,j,v;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
dis[i]=g[u][i];
dis[u]=0;
vis[u]=1;
for(i=1;i<n;i++)
{
int mi=inf,v=u;
for(j=0;j<n;j++)
{
if(!vis[j]&&dis[j]<mi){
mi=dis[j];
v=j;
}
}
vis[v]=1;
for(j=0;j<n;j++)
{
if(!vis[j]&&dis[j]>dis[v]+g[v][j])
dis[j]=dis[v]+g[v][j];
}
}
int ans=dis[n-1];
if(ans==inf)
return -1;
return ans;
}
int main()
{
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&L);
for(i=0;i<n;i++)
scanf("%d",&p[i]);
for(i=0;i<m;i++)
scanf("%d%d",&cost[i],&val[i]);
sort(p,p+n);
DP();
build();
printf("%d\n",dij(0));
}
return 0;
}
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 100000+20;
struct data
{
int L,R,mx;
int mid() {return (L + R)/2;}
}SegTree[maxn<<2];
void built (int root,int begin,int end)
{
SegTree[root].L = begin; SegTree[root].R = end;
if (begin == end)
{
SegTree[root].mx = 0; return ;
}
built(root<<1,begin,SegTree[root].mid());
built(root<<1|1,SegTree[root].mid()+1,end);
SegTree[root].mx = max(SegTree[root<<1].mx,SegTree[root<<1|1].mx);
return ;
}
void add (int root,int pos,int val)
{
if (SegTree[root].L == pos && pos == SegTree[root].R)
{
SegTree[root].mx = val; return ;
}
if (pos <= SegTree[root].mid()) add(root<<1,pos,val);
else if (pos >= SegTree[root].mid()+1) add(root<<1|1,pos,val);
SegTree[root].mx = max (SegTree[root<<1].mx,SegTree[root<<1|1].mx);
return ;
}
int find (int root,int begin,int end)
{
if (begin <= SegTree[root].L && end >= SegTree[root].R) return SegTree[root].mx;
if (end <= SegTree[root].mid())
return find(root<<1,begin,end);
else if (begin >= SegTree[root].mid() + 1)
return find(root<<1|1,begin,end);
else
{
int Lmax = find(root<<1,begin,end);
int Rmax = find(root<<1|1,begin,end);
return max(Lmax,Rmax);
}
}
void work ()
{
built(1,0,maxn-20);
int n;
int k;
scanf ("%d%d",&n,&k);
for (int i=1;i<=n;++i)
{
int x;
scanf ("%d",&x);
int a = max(0,x-k);
int b = min(maxn-20,x+k);
int t = find(1,a,b);
add(1,x,t+1);
}
printf ("%d\n",find(1,0,maxn-20));
return ;
}
int main()
{
#ifdef local
freopen("data.txt","r",stdin);
#endif
int t;
scanf ("%d",&t);
while(t--) work();
return 0;
}