「BZOJ1865」[Poetize I] 终极武器
背景 Background
经过一番周折,精英队伍的队员们终于来到了关押applepi的牢狱面前。心中神一般的领袖applepi就在眼前,队员们都不由自主地跪烂膝盖……不过令他们沮丧的是,牢狱的大锁没有钥匙孔,黑魔法师Vani根本就没有指望它再被打开。幸好队员们携带了新研制的终极武器——k型氙激光器(Xenon Laser – k,代号XLk),可以用来破拆这把锁。不过作为一道终极武器,它的启用规则异常严格。
描述 Description
Xenon Laser – k上共有N个波段能够发射激光,每个波段可以用一个闭区间[ai,bi]来表示,其中ai,bi为正整数,b[i-1]<ai<=bi。对于两个数字p和q,如果对于这N个波段内的任意一个整数num,把它在十进制表示下的后k位中某一位上的p换成q(或者q换成p),都满足得到的整数仍然在这N个波段内,那么称在该激光器中,数字p和q是k等价的。我们称两两之间k等价的数字组成一个k等价类。
激光器附带了9个发射匣,代表1~9这9个数字。只有把同一个等价类的数字对应的发射匣安置在一排上,Xenon Laser – k才能够启动。给定N个波段,现在就请你求出1~9这9个数字分成了哪些等价类,并且每行输出一个等价类。
本题描述比较抽象,请参考样例解释。
激光器附带了9个发射匣,代表1~9这9个数字。只有把同一个等价类的数字对应的发射匣安置在一排上,Xenon Laser – k才能够启动。给定N个波段,现在就请你求出1~9这9个数字分成了哪些等价类,并且每行输出一个等价类。
本题描述比较抽象,请参考样例解释。
输入格式 InputFormat
第一行两个整数N,k。
接下来N行每行两个整数ai,bi。ai,bi为正整数,满足b[i-1]<ai<=bi。
接下来N行每行两个整数ai,bi。ai,bi为正整数,满足b[i-1]<ai<=bi。
输出格式 OutputFormat
每行一个等价类,各行之内都按照数字从小到大排序,数字中间没有空格,行与行之间按照等价类中最小的数字从小到大排序。具体格式参考样例。
样例输入 SampleInput [复制数据]
样例输入1
1 1
1 566样例输入2
1 2
30 75
1 1
1 566样例输入2
1 2
30 75
样例输出 SampleOutput [复制数据]
样例输出1
123456
789样例输出2
12
345
6
7
89
123456
789样例输出2
12
345
6
7
89
数据范围和注释 Hint
第一个样例中,只允许修改个位。对于1~559这些数,个位无论如何修改都在波段内。对于560~566这些数,个位修改为大于等于7的数字时(例如562的2修改为8),就不在波段内了。因此1~6和7~9属于不同的等价类。
第二个样例每一位上都可以修改。修改方法与上面一个样例类似。对于25% 的数据,1<=n<=50,1<=ai<=bi<=6000。
对于另25% 的数据,n=1。
对于另30% 的数据,k=1。
对于100% 的数据,1<=n<=10000,1<=k<=19,1<=ai<=bi<=10^18。
在所有的数据中,均匀分布着25% 的随机数据。
第二个样例每一位上都可以修改。修改方法与上面一个样例类似。对于25% 的数据,1<=n<=50,1<=ai<=bi<=6000。
对于另25% 的数据,n=1。
对于另30% 的数据,k=1。
对于100% 的数据,1<=n<=10000,1<=k<=19,1<=ai<=bi<=10^18。
在所有的数据中,均匀分布着25% 的随机数据。
题解
我使用了黑暗算法样例没过不过可以得50
就是比如一个区间24-59可以改任何位,就认为2-5和之外的不同等价类,4-9和之外的不同等价类。。。
大家还是看正解为好
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<set> #include<vector> #include<algorithm> #define inf 1000000000 #define ll long long using namespace std; 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; } int n,K; ll bin[20]; int ans[10][10],top[10]; ll a[10005],b[10005]; bool jud(int id,int k,int x,int y) { int t1=a[id]/bin[k]%10,t2=b[id]/bin[k]%10; if(t1>t2)swap(t1,t2); if(t1<x&&x<t2) if(t1>=y||t2<=y) return 0; return 1; } bool equ(int x,int y) { if(x==y)return 1; for(int i=1;i<=n;i++) for(int j=1;j<=K;j++) if(!jud(i,j,x,y)||!jud(i,j,y,x))return 0; return 1; } int main() { //freopen("laser.in","r",stdin); //freopen("laser.out","w",stdout); bin[1]=1;for(int i=2;i<=20;i++)bin[i]=bin[i-1]*10; n=read();K=read(); for(int i=1;i<=n;i++) { a[i]=read(),b[i]=read(); a[i]--;b[i]++; } for(int i=1;i<=9;i++) for(int j=1;j<=i;j++) if(equ(i,j)) { ans[j][++top[j]]=i; break; } for(int i=1;i<=9;i++) if(top[i]) { for(int j=1;j<=top[i];j++) printf("%d",ans[i][j]); printf("\n"); } return 0; } |
Subscribe