感觉人不是很在状态,继续被教育。
交互玩一年没玩出来,感觉还是智力不足啊。
C:排个序前缀和搞一搞。
注意这里是一堆卡片,不是一 Priority_queue 卡片
出题人能不能不要没事儿用heap这种具有特殊意义的单词啊woc!
害人不浅。
#include<bits/stdc++.h>
using namespace std;
long long a[200010];
long long sum[200010];
int n;
int main() {
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%lld", &a[i]);
// sort(a+1, a+n+1);
for(int i=1;i<=n;++i) {
sum[i] = sum[i-1] + a[i];
}
long long ans = 123123123123123123;
for(int i=1;i<n;++i) {
long long ab = sum[i] - (sum[n] - sum[i]);
if(ab < 0)
ab = -ab;
ans = min(ans, ab);
}
cout<<ans;
return 0;
}
D:
显然是抢占
1
−
n
1-n
1−n路径上的点。处理个dep,处理个siz和fa,搞一搞就行了。
#include<bits/stdc++.h>
using namespace std;
vector<int>ed[100010];
int fa[100010], dep[100010], siz[100010];
int n;
inline void dfs(int nw,int fro) {
for(int i=0;i<ed[nw].size();++i) {
int tar = ed[nw][i];
if(fa[tar])
continue;
else {
fa[tar] = nw, dep[tar] = dep[nw] + 1;
dfs(tar, nw), siz[nw] += siz[tar];
}
}
siz[nw]++;
return;
}
inline void ade(int l,int r) {
ed[l].push_back(r);
ed[r].push_back(l);
}
int main() {
int l, r;
scanf("%d", &n);
for(int i=1; i<n; ++i) {
scanf("%d%d", &l, &r);
ade(l, r);
}
fa[1] = dep[1] = 1;
dfs(1, 1);
int tim = (dep[n] - 2) / 2;
int nloc = n;
for(int i=1;i<=tim;++i)
nloc = fa[nloc];
bool ok = 0;
if(dep[n] % 2 == 1) {
if(siz[nloc] > n - siz[nloc])
ok = 1;
}
else {
if(siz[nloc] >= n - siz[nloc])
ok = 1;
}
printf(!ok ? "Fennec" : "Snuke");
return 0;
}
E:题解表示先确定位数,然后直接上二分,确定前n-1位,大力最后一位。
但我从左往右挨个卡数码怎么就不行!
这辣鸡玩意为什么挂了!
为什么!这究竟是为什么!
震怒.jpg
好吧yysy还是题解更妙一点,不服不行。
贴个别人的STD好了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#define ll long long
#define pb push_back
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define cls(name,x) memset(name,x,sizeof(name))
#define pos first
#define index second
#define mp make_pair
using namespace std;
const int inf=1e9+10;
const ll llinf=1e16+10;
const int maxn=2e5+10;
const int maxm=1e2+10;
const int mod=1e9+7;
int n;
char op[10];
int init()
{
int k=10;
for(int i=1;i<=9;i++)
{
printf("? %lld\n",k);
fflush(stdout);
scanf("%s",op);
if(op[0]=='N')
return i;
k=k*10;
}
k=9;
for(int i=1;i<=9;i++)
{
printf("? %lld\n",k);
fflush(stdout);
scanf("%s",op);
if(op[0]=='Y')
return i;
k=k*10+9;
}
return 10;
}
int main()
{
//freopen("in.txt","r",stdin);
int len=init();
if(len==10)
{
printf("! %d\n",(int)1e9);
return 0;
}
int ans=0;
for(int i=1;i<len;i++)
{
int l=0,r=9,t=0;
while(l<=r)
{
int mid=(l+r)/2;
printf("? %d\n",ans*10+mid);
fflush(stdout);
scanf("%s",op);
if(op[0]=='Y')
{
t=max(t,mid);
l=mid+1;
}
else
r=mid-1;
}
ans=ans*10+t;
}
for(int i=(len==1?1:0);i<=9;i++)
{
printf("? %lld\n",((ll)ans*10+i)*10);
fflush(stdout);
scanf("%s",op);
if(op[0]=='Y')
{
ans=ans*10+i;
break;
}
}
printf("! %d\n",ans);
return 0;
}
F:看起来是个斯坦纳树,而liangs333并不会斯坦纳树,就咕了。