B
写离散的经验太少了,状压本身挺一眼,但离散化就是写不好
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int P=998244353;
using ll=long long;
using pii=pair<int,int>;
ll inv[20]={1,1,499122177,332748118,748683265,598946612,166374059,855638017,873463809,443664157,299473306,272248460,582309206,460728163};
void add(ll &a,ll b){a+=b;if(a>=P)a-=P;}
vector<pii> pd,pu;
ll dp[1<<12];
int n,full,st[40][40],nw_ful;
void dfs(int u,int sta)
{
if(u==n)
{
dp[sta]=nw_ful==full?0:-1;
return ;
}
dfs(u+1,sta);
for(int i=pd[u].x;i<pu[u].x;++i)
for(int j=pd[u].y;j<pu[u].y;++j)
nw_ful+=!st[i][j]++;
dfs(u+1,sta|1<<u);
for(int i=pd[u].x;i<pu[u].x;++i)
for(int j=pd[u].y;j<pu[u].y;++j)
nw_ful-=!--st[i][j];
}
void solve()
{
scanf("%d",&n);
vector<int> sx,sy;
int W,H;scanf("%d%d",&W,&H);
sx.push_back(0);sy.push_back(0);
sx.push_back(W);sy.push_back(H);
pd.clear();pd.resize(n+1);
pu.clear();pu.resize(n+1);
for(int i=0;i<n;++i)
{
scanf("%d%d%d%d",&pd[i].x,&pd[i].y,&pu[i].x,&pu[i].y);
pd[i].x=min(pd[i].x,W);pu[i].x=min(pu[i].x,W);
pd[i].y=min(pd[i].y,H);pu[i].y=min(pu[i].y,H);
sx.push_back(pd[i].x);sx.push_back(pu[i].x);
sy.push_back(pd[i].y);sy.push_back(pu[i].y);
}
sort(sx.begin(),sx.end());sort(sy.begin(),sy.end());
sx.erase(unique(sx.begin(),sx.end()),sx.end());
sy.erase(unique(sy.begin(),sy.end()),sy.end());
int w=(int)sx.size()-1,h=(int)sy.size()-1;
full=w*h;
for(int i=0;i<n;++i)
{
pd[i].x=lower_bound(sx.begin(),sx.end(),pd[i].x)-sx.begin();
pu[i].x=lower_bound(sx.begin(),sx.end(),pu[i].x)-sx.begin();
pd[i].y=lower_bound(sy.begin(),sy.end(),pd[i].y)-sy.begin();
pu[i].y=lower_bound(sy.begin(),sy.end(),pu[i].y)-sy.begin();
}
nw_ful=0;
memset(st,0,sizeof(st));
dfs(0,0);
if(dp[(1<<n)-1]==-1){printf("-1\n");return ;}
for(int state=(1<<n)-1;~state;--state)
if(dp[state]==-1)
{
int cnt=__builtin_popcount(state);
ll rs=0;
for(int j=0;j<n;++j)if(!(state&1<<j))add(rs,dp[state^1<<j]);
dp[state]=(n+rs)%P*inv[n-cnt]%P;
}
printf("%lld\n",dp[0]);return ;
}
int main()
{
int T;scanf("%d",&T);while(T--)solve();
}
C
很神秘的嗯搞
#include<bits/stdc++.h>
using namespace std;
using ld=long double;
const int N=2e5+70;
ld f[N*20+10],pr[N*20+10];
int main()
{
for(int i=1;i<N*20+10;++i)
{
f[i]=1+(pr[i-1]-pr[max(i-N,0)])/N;
pr[i]=pr[i-1]+f[i];
}
int T;scanf("%d",&T);
while(T--)
{
ld x;scanf("%Lf",&x);
printf("%.6Lf\n",f[(int)(N/x)+1]);
}
}
D
手玩两下发现可以构造成二进制数,然后忘记考虑0就寄了几发。
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main()
{
ll k;
scanf("%lld",&k);
if(!k)
{
cout<<4<<'\n';
cout<<"2 1 4 3";
return 0;
}
int cnt=0,p=114514;
k-=1;
vector<int> rs1,rs2;
if(!k)
{
cout<<6<<'\n';
cout<<"1 1 4 5 1 4";
return 0;
}
while(k)
{
if(k&1)
{
for(int i=1;i<=cnt;++i)
rs1.push_back(cnt+1);
rs2.push_back(++p);
}
++cnt;
k>>=1;
}
printf("%d\n",(int)rs1.size()+(int)rs2.size());
for(auto v:rs1)printf("%d ",v);
for(auto v:rs2)printf("%d ",v);
return 0;
}
E
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
typedef long long ll;
#define int ll
int n,m;
int cntr[N],cntl[N];
int res;
struct node
{
int l,r,id;
}q[N];
int ans[N];
int a[N],len;
int get(int x)
{
return x / len ;
}
bool cmp(node &a,node &b)
{
int al=get(a.l),bl=get(b.l);
if(al==bl) return a.r<b.r;
return a.l<b.l;
}
void add(int x,int op)
{
if(op==1)
{
cntr[x]--;
res-=cntl[x];
}
else
{
cntl[x]--;
res-=cntr[x];
}
}
void del(int x,int op)
{
if(op==1)
{
cntr[x]++;
res+=cntl[x];
}
else
{
cntl[x]++;
res+=cntr[x];
}
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
cntr[a[i]]++;
}
scanf("%lld",&m);
len=300;
for(int i=1;i<=m;i++)
{
int l,r;
scanf ("%lld%lld",&l,&r);
q[i]={l,r,i};
}
sort(q+1,q+1+m,cmp);
int L=1,R=0;
for(int i=1;i<=m;i++)
{
int l=q[i].l,r=q[i].r,id=q[i].id;
while(R<r) add(a[++R],1);
while(R>r) del(a[R--],1);
while(L<l) del(a[L++],0);
while(L>l) add(a[--L],0);
// cout<<res<<" "<<id<<"\n";
ans[id]=l*(n-r+1)-res;
}
for(int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}
F
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e5+10;
using ld=long double;
const ll inf=1e8;
ld rs;
vector<int> e[N];
ll dp[N][4],b[N];
void dfs(int u,int fa)
{
dp[u][0]=b[u];
for(auto v:e[u])
{
if(v==fa)continue;
dfs(v,u);
if(dp[u][1]!=-inf)
dp[u][2]=max(dp[u][2],dp[v][0]+dp[u][1]);
if(dp[v][1]!=-inf)
dp[u][2]=max(dp[u][2],dp[u][0]+dp[v][1]);
dp[u][1]=max(dp[u][0]+dp[v][0],dp[u][1]);
}
if(dp[u][2]!=-inf)
rs=max(rs,(ld)(1.0*dp[u][2]*dp[u][2])/36);
if(dp[u][1]!=-inf)
rs=max(rs,(ld)(1.0*dp[u][1]*dp[u][1])/16);
}
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%lld",&b[i]);
for(int i=1,u,v;i<n;++i)
{
scanf("%d%d",&u,&v);e[u].push_back(v);e[v].push_back(u);
}
for(int i=1;i<=n;++i)for(int j=0;j<3;++j)dp[i][j]=-inf;
dfs(1,-1);
for(int i=1;i<=n;++i)b[i]=-b[i];
for(int i=1;i<=n;++i)for(int j=0;j<3;++j)dp[i][j]=-inf;
dfs(1,-1);
printf("%.8Lf\n",rs);
}
G
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ld=long double;
const int N=1e2+10;
ld p[N],rs;
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%Lf",&p[i]);
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(i!=j)rs+=p[i]*p[j]/(p[i]+p[j]);
printf("%.8Lf\n",rs);
}
J
看到别人代码里有个10行的感觉很神秘,队友写了150行?
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=200005;
int v[N],sam[N*2][26],link[N*2],len[N*2],sam_cnt,last,n;
int ee[N*2];
char s[N];
long long tree[N*4],gg;
int cnt[N*4]; // cnt[i] --> 存储对应长度的字符串的数量
long long res;
struct pp
{
int l;
int k;
int idx;
}qq[N];
long long ans[N];
void push_up(int p)
{
tree[p]=tree[p<<1]+tree[p<<1|1];
cnt[p]=cnt[p<<1]+cnt[p<<1|1];
}
void modify(int p, int tl, int tr, int x, int vv)
{
if(tl==tr)
{
cnt[p]+=vv;
tree[p]+=v[x]*vv;
return ;
}
int mid=(tl+tr)>>1;
if(x<=mid)
modify(p<<1, tl, mid, x, vv);
else
modify(p<<1|1, mid+1, tr, x, vv);
push_up(p);
}
int query(int p, int tl, int tr, int k)
{
if(tl==tr)
{
gg+=tree[p];
return tl;
}
int val=cnt[p<<1|1];
int mid=(tl+tr)>>1;
if(val>=k)
return query(p<<1|1, mid+1, tr, k);
gg+=tree[p<<1|1];
return query(p<<1, tl, mid, k-val);
}
void init()
{
last=sam_cnt=1;
memset(tree,0,sizeof(tree));
memset(cnt,0,sizeof(cnt));
}
void add(int c)
{
int p,cur=++sam_cnt;
len[cur]=len[last]+1;
for(p=last; p && !sam[p][c]; p=link[p])
sam[p][c]=cur;
ee[cur]=1;
modify(1, 1, n, len[cur], 1);
if(!p)
link[cur]=1;
else
{
int q=sam[p][c];
if(len[q]==len[p]+1)
{
if(ee[q])
ee[q]=0,modify(1, 1, n, len[q], -1);
link[cur]=q;
}
else
{
int cl=++sam_cnt;
len[cl]=len[p]+1;
link[cl]=link[q];
memcpy(sam[cl], sam[q], sizeof(sam[q]));
while(p && sam[p][c]==q)
{
sam[p][c]=cl;
p=link[p];
}
link[cur]=link[q]=cl;
}
}
last=cur;
}
bool cmp(struct pp a, struct pp b)
{
return a.l<b.l;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
init();
int q;
scanf("%d%d", &n, &q);
scanf("%s", s+1);
for(int i=1; i<=n; i++)
scanf("%d", &v[i]);
int now=0;
for(int i=1; i<=q; i++)
scanf("%d%d", &qq[i].l, &qq[i].k),qq[i].idx=i;
sort(qq+1, qq+1+q, cmp);
for(int i=1; i<=q; i++)
{
while(now<qq[i].l)
add(s[++now]-'a');
gg=0;
query(1, 1, n, qq[i].k);
ans[qq[i].idx]=gg;
}
for(int i=1; i<=q; i++)
cout << ans[i] << '\n';
for(int i=0; i<=sam_cnt; i++)
{
link[i]=ee[i]=len[i]=0;
memset(sam[i],0,sizeof(sam[i]));
}
}
return 0;
}
K
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void solve()
{
ll n,a,b;scanf("%lld%lld%lld",&n,&a,&b);
printf("%lld\n",(n-1)*a/b+1);
}
int main()
{
int T;scanf("%d",&T);while(T--)solve();
}