首页 > 其他 > 详细

Codeforces Round #429 Div. 1

时间:2019-03-10 11:07:38      阅读:129      评论:0      收藏:0      [点我收藏+]

  A:甚至连题面都不用仔细看,看一下样例就知道是要把大的和小的配对了。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while ((c<‘A‘||c>‘Z‘)&&(c<‘a‘||c>‘z‘)&&(c<‘0‘||c>‘9‘)) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
	int x=0,f=1;char c=getchar();
	while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();}
	while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
int n,id[N],ans[N];
struct data
{
	int x,y,i;
	bool operator <(const data&a)  const
	{
		return y<a.y;
	}
}a[N];
bool cmp(const data&a,const data&b)
{
	return a.x>b.x;
}
signed main()
{
#ifndef ONLINE_JUDGE
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
#endif
	n=read();
	for (int i=1;i<=n;i++) a[i].x=read();
	for (int i=1;i<=n;i++) a[i].y=read(),a[i].i=i;
	sort(a+1,a+n+1);
	for (int i=1;i<=n;i++) id[i]=a[i].i;//??iС????id[i] 
	sort(a+1,a+n+1,cmp);
	for (int i=1;i<=n;i++) ans[id[i]]=a[i].x;
	for (int i=1;i<=n;i++) printf("%d ",ans[i]);
	return 0;
	//NOTICE LONG LONG!!!!!
}

  B:vp时拿命想都不会,结果一看sol发现idea还很大一部分是我自己造过的题,简直自闭。显然度数之和应该是偶数,先给不要求度数的随便分配一下满足要求。然后找一棵生成树,自底向上只选树边以满足度数要求即可。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 300010
char getc(){char c=getchar();while ((c<‘A‘||c>‘Z‘)&&(c<‘a‘||c>‘z‘)&&(c<‘0‘||c>‘9‘)) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
	int x=0,f=1;char c=getchar();
	while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();}
	while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
int n,m,a[N],p[N],ans[N],u,t;
bool flag[N];
struct data{int to,nxt;
}edge[N<<1];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void dfs(int k)
{
	flag[k]=1;
	for (int i=p[k];i;i=edge[i].nxt)
	if (!flag[edge[i].to])
	{
		dfs(edge[i].to);
		if (a[edge[i].to]) ans[++u]=(i-1)/2+1,a[k]^=1;
	}
}
signed main()
{
#ifndef ONLINE_JUDGE
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
#endif
	n=read(),m=read();int cnt=0,cnt2=0;
	for (int i=1;i<=n;i++) a[i]=read(),cnt+=(a[i]==-1),cnt2+=(a[i]==1);
	if (cnt==0&&(cnt2&1)) {cout<<-1;return 0;}
	for (int i=1;i<=n;i++) if (a[i]==-1) if (cnt2&1) cnt2=0,a[i]=1;else a[i]=0;
	for (int i=1;i<=m;i++)
	{
		int x=read(),y=read();
		addedge(x,y),addedge(y,x);
	}
	dfs(1);
	cout<<u<<endl;
	for (int i=1;i<=u;i++) printf("%d ",ans[i]);
	return 0;
	//NOTICE LONG LONG!!!!!
}

  C:我省去年初中组直接把这个题搬过来压轴,很久以前口胡过然而并没有写,于是vp时就去搬了份代码交了()。待补。

  D:显然满足条件的数一定是区间内出现次数前k大的。考虑回滚莫队,维护一下出现次数区间前5大的数即可。稍微卡卡常就行了。正解待补。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1;c=getchar();}
    while (c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define N 300010
#define ll long long
int n,m,a[N],b[N],cnt[N],mx[6],ans[N],tmp_mx[6];
struct data
{
    int x,y,k,i,u;
    bool operator <(const data&a) const
    {
        return k<a.k||k==a.k&&y<a.y;
    }
}q[N];
void ins(int qwq)
{
	if (cnt[qwq]<cnt[mx[5]]) return;
	int p=0;
	for (int k=1;k<=5;k++) if (mx[k]==qwq) {p=k;break;}
	if (!p) mx[5]=qwq,p=5;
	while (p>1&&cnt[mx[p]]>cnt[mx[p-1]]) swap(mx[p],mx[p-1]),p--;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    const char LL[]="%I64d\n";
#else
    const char LL[]="%lld\n";
#endif
    n=read(),m=read();
    for (int i=1;i<=n;i++) a[i]=read();
    int block=sqrt(n*5);
    for (int i=1;i<=m;i++) q[i].x=read(),q[i].y=read(),q[i].u=read(),q[i].k=q[i].x/block,q[i].i=i;
    sort(q+1,q+m+1);
    for (int i=1;i<=m;i++)
    {
    	for (int k=1;k<=5;k++) mx[k]=0;
        int t=i;while (t<m&&q[t+1].k==q[i].k) t++;
        while (i<=t&&q[i].y<(q[i].k+1)*block)
        {
            for (int j=q[i].x;j<=q[i].y;j++)
            {
                cnt[a[j]]++;
                ins(a[j]);
            }
            ans[q[i].i]=N;
            for (int k=1;k<=5;k++) if (1ll*cnt[mx[k]]*q[i].u>q[i].y-q[i].x+1) ans[q[i].i]=min(ans[q[i].i],mx[k]);
            if (ans[q[i].i]==N) ans[q[i].i]=-1;
            for (int j=q[i].x;j<=q[i].y;j++) cnt[a[j]]--;
            i++;
    		for (int k=1;k<=5;k++) mx[k]=0;
        }
        int r=(q[i].k+1)*block-1;
        for (int j=i;j<=t;j++)
        {
            while (r<q[j].y)
            {
                cnt[a[++r]]++;
                ins(a[r]);
            }
        	for (int k=1;k<=5;k++) tmp_mx[k]=mx[k];
            for (int k=(q[i].k+1)*block-1;k>=q[j].x;k--)
            {
                cnt[a[k]]++;
                ins(a[k]);
            }
            ans[q[j].i]=N;
            for (int k=1;k<=5;k++) if (1ll*cnt[mx[k]]*q[j].u>q[j].y-q[j].x+1) ans[q[j].i]=min(ans[q[j].i],mx[k]);
            if (ans[q[j].i]==N) ans[q[j].i]=-1;
            for (int k=(q[i].k+1)*block-1;k>=q[j].x;k--) cnt[a[k]]--;
            for (int k=1;k<=5;k++) mx[k]=tmp_mx[k];
        }
        r=(q[i].k+1)*block-1;
        for (int j=i;j<=t;j++)
        while (r<q[j].y) cnt[a[++r]]=0;
        i=t;
    }
    for (int i=1;i<=m;i++) printf("%d\n",ans[i]);
    return 0;
}

  E:待补。

 

Codeforces Round #429 Div. 1

原文:https://www.cnblogs.com/Gloid/p/10503993.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!