Gym 101955G Best ACMer Solves the Hardest Problem
作者:互联网
http://codeforces.com/gym/101955/problem/G
这题的关键在于k<=1e7
于是只需要枚举所有x^2+y^2<=1e7,然后k=x^2+y^2这里地方就多一种方案
最后发现所有数字中最多的拆分方案只有24种
那么直接m*kk[k].size()暴力做就行了。
用tim[x][y]作时间戳,记录这个位置保存的值是否是当前第cas组数据中的值
#include<bits/stdc++.h>
#define maxl 6010
using namespace std;
const int mod=6000;
int n,m,cas,up=sqrt(10000000);
int a[maxl][maxl],tim[maxl][maxl];
typedef pair<int,int> p;
vector <p> kk[10000010];
int tx[5]={0,1,1,-1,-1};
int ty[5]={0,1,-1,1,-1};
vector <p> tmp;
inline void prework()
{
++cas;
scanf("%d%d",&n,&m);
int x,y,w;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&w);
a[x][y]=w;tim[x][y]=cas;
}
}
inline void mainwork()
{
printf("Case #%d:\n",cas);
long long lastans=0,ans;int op,x,y,k,w,l,xx,yy,dx,dy;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&op,&x,&y);
x=(x+lastans)%mod+1;
y=(y+lastans)%mod+1;
if(op==1)
{
scanf("%d",&w);
a[x][y]=w;tim[x][y]=cas;
}
if(op==2)
{
a[x][y]=0;
tim[x][y]=0;
}
if(op==3)
{
tmp.clear();
scanf("%d%d",&k,&w);
l=kk[k].size();
for(int j=0;j<l;j++)
{
dx=kk[k][j].first;dy=kk[k][j].second;
for(int o=1;o<=4;o++)
{
xx=x+dx*tx[o];yy=y+dy*ty[o];
if(xx<1 || xx>6000 || yy<1 || yy>6000)
continue;
if(tim[xx][yy]==cas)
tmp.push_back(make_pair(xx,yy));
}
swap(dx,dy);
for(int o=1;o<=4;o++)
{
xx=x+dx*tx[o];yy=y+dy*ty[o];
if(xx<1 || xx>6000 || yy<1 || yy>6000)
continue;
if(tim[xx][yy]==cas)
tmp.push_back(make_pair(xx,yy));
}
}
sort(tmp.begin(),tmp.end());
tmp.erase(unique(tmp.begin(),tmp.end()),tmp.end());
l=tmp.size();
for(int j=0;j<l;j++)
{
xx=tmp[j].first;yy=tmp[j].second;
a[xx][yy]+=w;
}
}
if(op==4)
{
ans=0;tmp.clear();
scanf("%d",&k);
l=kk[k].size();
for(int j=0;j<l;j++)
{
dx=kk[k][j].first;dy=kk[k][j].second;
for(int o=1;o<=4;o++)
{
xx=x+dx*tx[o];yy=y+dy*ty[o];
if(xx<1 || xx>6000 || yy<1 || yy>6000)
continue;
if(tim[xx][yy]==cas)
tmp.push_back(make_pair(xx,yy));
}
swap(dx,dy);
for(int o=1;o<=4;o++)
{
xx=x+dx*tx[o];yy=y+dy*ty[o];
if(xx<1 || xx>6000 || yy<1 || yy>6000)
continue;
if(tim[xx][yy]==cas)
tmp.push_back(make_pair(xx,yy));
}
}
sort(tmp.begin(),tmp.end());
tmp.erase(unique(tmp.begin(),tmp.end()),tmp.end());
l=tmp.size();
for(int j=0;j<l;j++)
{
xx=tmp[j].first;yy=tmp[j].second;
ans+=a[xx][yy];
}
printf("%lld\n",ans);
lastans=ans;
}
}
}
inline void print()
{
}
int main()
{
//freopen("G.in","r",stdin);
for(int i=0;i<=up;i++)
for(int j=i;j<=up;j++)
{
if(i*i+j*j>1e7)
break;
kk[i*i+j*j].push_back(make_pair(i,j));
}
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}
标签:tmp,cas,end,Solves,int,Gym,yy,ACMer,xx 来源: https://blog.csdn.net/liufengwei1/article/details/101111519