zoukankan      html  css  js  c++  java
  • CCF201812-3 CIDR合并

    按题意模拟即可。。。主要CCF吞代码。。。

    #include<bits/stdc++.h>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ls (x<<1)
    #define rs (x<<1|1)
    #define ll long long
    #define For(i,a,b) for(int i=a;i<=b;i++)
    #define Forr(i,a,b) for(int i=a;i>=b;i--)
    #define Fr(i,a,b) for(int i=a;i<b;i++)
    #define Frr(i,a,b) for(int i=a;i>b;i--)
    #define pll pair<ll,ll>
    using namespace std;
    const int maxn=1e6+100;
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    struct node
    {
    	int s[5];
    	friend bool operator<(node a,node b)
    	{
    		if(a.s[0]!=b.s[0])return a.s[0]<b.s[0];
    		if(a.s[1]!=b.s[1])return a.s[1]<b.s[1];
    		if(a.s[2]!=b.s[2])return a.s[2]<b.s[2];
    		if(a.s[3]!=b.s[3])return a.s[3]<b.s[3];
    		return a.s[4]>b.s[4];
    	}
    }no[maxn];
    int n,m;
    string str;
    int p[10],q[10];
    int cnt1,cnt2;
    int cal(int l,int r)
    {
    	int ans=0;
    	int sr=1;
    	for(int i=r;i>=l;i--)
    	{
    		ans+=(str[i]-'0')*sr;
    		sr*=10;
    	}
    	return ans;
    }
    void init()
    {
    	cin>>n;getchar();
    	for(int i=1;i<=n;i++)
    	{
    		cin>>str;
    		int len=str.length();
    		cnt1=cnt2=0;
    		for(int j=0;j<len;j++)
    		{
    			if(str[j]=='.')p[++cnt1]=j;
    			if(str[j]=='/')q[++cnt2]=j;
    		}	
    		int las=0;
    		if(!cnt1)
    		{
    			if(!cnt2)
    			{
    				no[i].s[0]=cal(0,len-1);
    				no[i].s[4]=8;
    			}
    			else
    			{
    				no[i].s[0]=cal(0,q[1]-1);
    				no[i].s[4]=cal(q[1]+1,len-1);
    			}
    		}
    		else
    		{
    			for(int j=1;j<=cnt1;j++)
    			{
    				int pl=p[j];
    				no[i].s[j-1]=cal(las,pl-1);
    				las=pl+1;
    			}
    			if(cnt2)
    			{
    				no[i].s[cnt1]=cal(las,q[cnt2]-1);
    				no[i].s[4]=cal(q[cnt2]+1,len-1);
    			}
    			else
    			{
    				no[i].s[cnt1]=cal(las,len-1);
    				no[i].s[4]=(cnt1+1)*8;
    			}
    		}
    	}
    
    }
    int nxt[maxn];
    pair<ll,ll> cal1(node aa)
    {
    	ll tmp=0;
    	ll st=1;
    	for(int i=3;i>=0;i--)
    	{
    		tmp+=aa.s[i]*st;
    		st*=256;
    	}
    	ll minn=(tmp/(1ll<<(32-aa.s[4])))*(1ll<<(32-aa.s[4]));
    	ll maxx=minn+(1ll<<(32-aa.s[4]))-1;
    	return mp(minn,maxx);
    }
    void solve1()
    {
    	sort(&no[1],&no[n+1]);
    	for(int i=1;i<=n;i++)
    	{
    		nxt[i]=i+1;
    	}
    	for(int i=1;i<=n;i=nxt[i])
    	{
    		int tt=nxt[i];
    		if(tt>n)break;
    		while(1)
    		{
    			if(tt>n)break;
    			pll a1=cal1(no[i]),a2=cal1(no[tt]);
    			if(a1.fi>=a2.fi&&a2.se>=a1.se)
    			{
    				no[i]=no[tt];
    				nxt[i]=nxt[tt];
    				tt=nxt[tt];
    			}
    			else if(a1.fi<=a2.fi&&a2.se<=a1.se)
    			{
    				nxt[i]=nxt[tt];
    				tt=nxt[tt];
    			}
    			else
    			{
    				break;
    			}
    		}	
    	}
    }
    int pr[maxn];
    void solve2()
    {
    	int pre=0;
    	for(int i=1;i<=n;i=nxt[i])
    	{
    		int tt=nxt[i];
    		int pre1=pre;
    		int j=i;
    		pr[i]=pre;
    		if(tt>n)break;
    		while(1)
    		{
    			tt=nxt[i];if(tt>n)break;
    			int flg=0;
    			if(no[i].s[4]==no[tt].s[4])
    			{
    				node ne=no[i];
    				if(no[i].s[4])
    					ne.s[4]=no[i].s[4]-1;
    				pll v1=cal1(ne);
    				pll v2=cal1(no[i]),v3=cal1(no[tt]);
    				if(v1.se-v1.fi==v3.se-v2.fi&&v2.fi==v1.fi&&v3.se==v1.se&&v2.se+1==v3.fi)
    				{
    					flg=1;
    					no[i]=ne;
    					nxt[i]=nxt[tt];
    				}
    				if(flg&&pre)
    				{
    					i=pr[i];
    					pre=pr[i];
    				}
    				if(!flg)
    				{
    					break;
    				}
    			}
    			else
    			{
    				break;
    			}
    		}
    		pre=i;
    	}
    }
    void print()
    {
    	for(int i=1;i<=n;i=nxt[i])
    	{
    		for(int j=0;j<=4;j++)
    		{
    			cout<<no[i].s[j];
    			if(j<3)cout<<".";
    			if(j==3)cout<<"/";
    		}cout<<"
    ";
    	}
    }
    int main()
    {
    	init();
    	solve1();
    	solve2();
    	print();
    }
    

      

  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/intwentieth/p/10484607.html
Copyright © 2011-2022 走看看