#533
D. Kilani and the Game
模拟一个游戏,每轮每个玩家可以把距离他拥有的领地的ki步内的格子占领,不能跨越别人的领地以及障碍,问最终每个人占领多少个格子。
写了好几种写法,然后调完才发现是不对的。
最终写了分轮dfs,每个人都有一个bfs队列。对于每一轮知道玩家占领格子的最远距离,当队列头是这些格子时就break出去,下一轮才会考虑从这些格子拓展,就能模拟出这题了。
#include
using namespace std;
typedef long long ll;
typedef pair pii;
typedef unsigned long long ull;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
const int maxn=1000+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
int n,m,p;
int s[10];
char ma[maxn][maxn];
int ans[10];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
bool vis[maxn][maxn];
int self[maxn][maxn][10];
queue que[10];
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=p;i++)scanf("%d",&s[i]);
memset(self,-1,sizeof(self));
for(int i=0;i=n||ny>=m)continue;
if(ma[nx][ny]=='#')continue;
if(vis[nx][ny])continue;
ans[i]++;
self[nx][ny][i]=self[cntx][cnty][i]+1;
vis[nx][ny]=1;
que[i].push(mp(nx,ny));
}
}
}
if(f==0)break;
}
for(int i=1;i<=p;i++)printf("%d ",ans[i]);
return 0;
}
E. Helping Hiasat
你可以改ID,朋友访问时如果你的ID是不是他的名字他就会不高兴,问有多少个朋友会是高兴的。
注意到每两次改名字之间的朋友之间,这有一个能在这一次不会不高兴。
所以问题转换成求最大独立集了。
用补图跑最大团,抄个模板就行了。
#include
using namespace std;
typedef long long ll;
typedef pair pii;
typedef unsigned long long ull;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
const int maxn=40+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
int n,m;
bool g[maxn][maxn];
int ans;
int mc[maxn];
int lis[maxn][maxn];
int len[maxn];
bool found;
void dfs(int siz){
int i,j,k;
if(len[siz]==0){
if(siz>ans){
ans=siz;
found=true;
}
return;
}
for(k=0;k ma;
int tot;
string name;
vector vec;
int main(){
scanf("%d%d",&n,&m);
for(int i=0,a;i<=n;i++){
if(i>name;
if(ma.find(name)==ma.end()){
ma[name]=++tot;
}
int id=ma[name];
vec.pb(id);
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
if(i==j)continue;
g[i][j]=1-g[i][j];
}
}
max_cluster();
printf("%d\n",ans);
return 0;
}
#534
D. Game with modulo
交互题,通过问两个数在模意义的大小关系,确定出模数。
还是挺厉害的这一道题目
首先对于i和2i,如果模数a在i和2i之间,那么模意义下i一定大于2i
所以可以倍增i来确定a所在下界
然后在这段区间内,满足前一部分模意义下大于i,后一部分模意义下小于i
第一个模意义下小于i的数就是模数了
还是有些细节的。询问次数也卡的比较死。
这种题目还是需要挖掘性质的,好题。
#include
using namespace std;
typedef long long ll;
typedef pair pii;
typedef unsigned long long ull;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
const int maxn=1e3+15;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
int n;
string str;
int main(){
while(1){
cin>>str;
if(str=="end"||str=="mistake")break;
cout<<"? 0 1"<>str;
if(str[0]=='x'){
cout<<"! 1"<>str;
if(str[0]=='e')exit(0);
else if(str[0]=='x'){
lef=i;rig=2*i;break;
}
}
int ret=lef;
int cc=lef;
lef++;
while(lef<=rig){
ll mid=(lef+rig)/2;
cout<<"? "<>str;
if(str[0]=='e')exit(0);
else if(str[0]=='x'){
rig=mid-1;
}
else{
ret=mid;
lef=mid+1;
}
}
cout<<"! "<