VP+补题 22昆明 BCDEFG JK

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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值