新泰网站开发制作,宝客上海网络科技有限公司,渭南网站建设哪家好,开发公司五证包括什么link
题意#xff1a; nnn个人围成一圈#xff0c;一开始每个人都有kkk张卡片#xff0c;每回合n−1n-1n−1个人会给左边⌊x2⌋\left \lfloor \frac{x}{2} \right \rfloor⌊2x⌋#xff0c;给右边⌈x2⌉\left \lceil \frac{x}{2} \right \rceil⌈2x⌉#xff0c;剩下…link
题意 nnn个人围成一圈一开始每个人都有kkk张卡片每回合n−1n-1n−1个人会给左边⌊x2⌋\left \lfloor \frac{x}{2} \right \rfloor⌊2x⌋给右边⌈x2⌉\left \lceil \frac{x}{2} \right \rceil⌈2x⌉剩下一个人会把所有的卡片都给右边。每次询问一个位置返回当前位置人拥有的卡片。询问不超过1000次找到只把卡片给右边人的位置。
思路 通过模拟可以发现这个特殊人的卡片数量是不变的且从他开始向右卡片数量kkk的人是随着回合数增加而增加的最后会达到一个不变的平衡。让后发现询问次数不超过1000而1e5314(大概)。\sqrt{1e5}314(大概)。1e5314(大概)。这就提示我们可以分块来做。我们可以先让他进行n\sqrt{n}n回合让后我们从111开始每次加n\sqrt{n}n直至当前的人的卡片kkk让后我们从这个人的位置往左走到第一个卡片数量kkk的位置即为我们需要求的位置输出即可。 但是这样会有点小问题如果我们进行n\sqrt{n}n轮后kkk的人数不足n\sqrt{n}n怎么办呢比如例子n4n4n4且k2k2k2特殊的人在第一个位置这样最终kkk的人为1让后我就把每次加n\sqrt{n}n改成了加n−1\sqrt{n}-1n−1这样就解决问题了。我也不会证但是确实这样是可以过的。
//#pragma GCC optimize(2)
#includecstdio
#includeiostream
#includestring
#includecstring
#includemap
#includecmath
#includecctype
#includevector
#includeset
#includequeue
#includealgorithm
#includesstream
#includectime
#includecstdlib
#define X first
#define Y second
#define L (u1)
#define R (u1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].ltr[u].r1)
#define Len(u) (tr[u].r-tr[u].l1)
#define random(a,b) ((a)rand()%((b)-(a)1))
#define db puts(---)
using namespace std;//void rd_cre() { freopen(d://dp//data.txt,w,stdout); srand(time(NULL)); }
//void rd_ac() { freopen(d://dp//data.txt,r,stdin); freopen(d://dp//AC.txt,w,stdout); }
//void rd_wa() { freopen(d://dp//data.txt,r,stdin); freopen(d://dp//WA.txt,w,stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pairint,int PII;const int N1000010,mod1e97,INF0x3f3f3f3f;
const double eps1e-6;int n,k;int query(int pos)
{printf(? %d\n,pos); fflush(stdout);int x; scanf(%d,x);return x;
}int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);scanf(%d%d,n,k);int blocksqrt(n);for(int i1;iblock;i) query(i);for(int i1;in;iblock-1){if(query(i)k){int posi-1;if(pos0) posn;while(query(pos)k){pos--;if(pos0) posn;}printf(! %d\n,pos); fflush(stdout);return 0;}}return 0;
}
/**/