关于O(能过)算法没有TLE却全体WA的那些事
查看原帖
关于O(能过)算法没有TLE却全体WA的那些事
62562
B_1168楼主2020/6/5 00:34

简而言之,抱着“试一试”的心态,写了个离散化暴力尝试卡过去----事实证明,评测结果并没有出现TLE情况,然而全体WA,样例能过,码风正常,有注释,求大佬帮忙看一下qwq

#include<bits/stdc++.h>
#define maxn 40005
using namespace std;

int n,m,cnt,mp[maxn];//mp数组是(离散化后)到(离散化前)的映射

struct node{
	int num,seq,upd;
}a[maxn];

//num:离散化前
//seq:输入顺序,用于离散化后复原顺序
//upd:离散化后

bool cmp1(node a,node b){//离散化
	return a.num<b.num;
}

bool cmp2(node a,node b){//复原顺序
	return a.seq<b.seq;
}

int main(){
//	freopen("P4168_1.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i].num);
		a[i].seq=i;//记录离散化前数值和顺序
	}
	sort(a+1,a+n+1,cmp1);
	cnt=0;//离散化值的计数器
	a[1].upd=0;
	for(int i=2;i<=n;i++){
		if(a[i].num>a[i-1].num){
			cnt++;
		}
		a[i].upd=cnt;
	}//随手写的离散化
	sort(a+1,a+n+1,cmp2);//恢复顺序
//	for(int i=1;i<=n;i++)printf("%d ",a[i].upd);
//	printf("\n");
	for(int i=1;i<=n;i++){
		mp[a[i].upd]=a[i].num;
	}//建立(离散化后)到(离散化前)的映射
	int l,r,cmax=0,ans=0;
	while(m--){
		scanf("%d%d",&l,&r);
		l=((l+ans-1)%n)+1;r=((r+ans-1)%n)+1;
		if(l>r)swap(l,r); //解密
//		printf("%d %d\n",l,r);
		ans=0;
		int b[cnt+1]; //该数组记载每个(离散化后的)数的出现次数
		memset(b,0,sizeof(b)); //每次memset,确保可靠性
		for(int i=l;i<=r;i++){
			b[a[i].upd]++;
		}
//		for(int i=0;i<=cnt;i++) printf("%d ",b[i]);
//		printf("\n");
		for(int i=cnt;i>=0;i--){
			if(cmax<=b[i]){
				cmax=b[i];
				ans=mp[i];
			}//在每一个离散化后的数后寻找哪一个数出现次数最多,如果找到了出现次数更多的,就更新“众数的出现次数”,利用先前建设的映射关系反离散化
		}
		if(ans==0) ans=mp[0];//卡样例……
		printf("%d\n",ans);
	} 
} 

/*
10 2
10 11 10 514 14 13 114 11 1919 14
1 5
2 5
*/
//测试无加密算法的样例

感谢大佬qwq

2020/6/5 00:34
加载中...