【NOIP模擬】K進制+排隊+世界盃

T1:

     矩陣快速冪+前綴和優化

 

代碼:

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

const int Max=100005;
int t,n,m,num[Max],sum;
char ch[Max];

inline int ksm(int a,int b,int mod)
{
	int ans=1;
	a%=mod;
	while(b)
	{
	  if(b&1) ans=(ans*a)%mod;
	  b>>=1;
	  a=(a*a)%mod;
	}
	return ans;
}

inline bool check()
{
	sum=0;
	for(int i=1;i<=n;i++)
	  if(ch[i]>='A') num[i]=(ch[i]-'A')+10;
	  else num[i]=ch[i]-'0';
	for(int i=1;i<=n;i++)
	  sum=(sum+num[i]*ksm(m,n-i,m-1))%(m-1);
	return !sum;
}

int main()
{
	scanf("%d\n",&t);
	while(t--)
	{
	  scanf("%d%s",&m,ch+1);
	  n=strlen(ch+1);
	  if(check()) printf("yes\n"); 
	  else printf("no\n");
	}
	return 0;
}

T2:

     折半搜索

 

代碼:

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int Max=18000000;
int n,m,h1,h2,h,t,ans,maxx,tot1,tot2;
int num[50],p1[50],p2[50],ans1[Max],ans2[Max];

inline int get_int()
{
	int x=0,f=1;
	char c;
	for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
	if(c=='-') f=-1,c=getchar();
	for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
	return x*f;
}

inline void dfs(int num,int s,int t,int ans[],int p[])
{
	ans[++h]=num;
	for(int i=s;i<=t;i++)
	{
	  int x=num;
	  while(x<=m/p[i])
	  {
	    dfs(x*p[i],i+1,t,ans,p);
	    x*=p[i];
	  }
	}
}

signed main()
{
	n=get_int(),m=get_int();
	for(int i=1;i<=n;i++) num[i]=get_int();
	for(int i=1;i<=n;i+=2) p1[++tot1]=num[i];
	for(int i=2;i<=n;i+=2) p2[++tot2]=num[i];
	dfs(1,1,tot1,ans1,p1),h1=h,h=0,dfs(1,1,tot2,ans2,p2),h2=h;
	sort(ans1+1,ans1+h1+1),sort(ans2+1,ans2+h2+1),t=h2;
	for(int i=1;i<=h1;i++)
	{
	  while(ans1[i]*ans2[t]>m) t--;
	  ans+=t;
	  maxx=max(maxx,ans1[i]*ans2[t]);
	}
	cout<<maxx<<"\n"<<ans;
	return 0;
}

T3:

     平衡樹

代碼:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	char ch=getchar();int i=0,f=1;
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){i=(i<<1)+(i<<3)+ch-'0';ch=getchar();}
	return i*f;
}
inline void W(int x){
	static int buf[50];
	if(!x){putchar('0');return;}
	if(x<0){putchar('-');x=-x;}
	while(x)buf[++buf[0]]=x%10,x/=10;
	while(buf[0])putchar(buf[buf[0]--]+'0');
}
const int Maxn=1e5+50;
int n,k;
struct node{
	int mx[7],mn[7],sze;
	friend inline bool operator <(const node &a,const node &b){
		for(int i=0;i<k;i++)if(a.mn[i]<b.mx[i])return true;
		return false;
	}
	friend inline bool operator >(const node &a,const node &b){
		for(int i=0;i<k;i++)if(a.mx[i]>b.mn[i])return true;
		return false;
	}
};
set<node>S;
typedef set<node>::iterator it;
inline void insert(){
	static node tmp;
	tmp.sze=1;
	for(int i=0;i<k;i++)tmp.mx[i]=tmp.mn[i]=read();
	it t=S.lower_bound(tmp);
	for(t=S.lower_bound(tmp);t!=S.begin();t=S.lower_bound(tmp)){
		t--;
		if((*t>tmp)){
			for(int i=0;i<k;i++){
				tmp.mx[i]=max(tmp.mx[i],t->mx[i]);
				tmp.mn[i]=min(tmp.mn[i],t->mn[i]);
			}
			tmp.sze+=t->sze;
			S.erase(t);
		}
		else break;
	}
	S.insert(tmp);
}
int main(){
	n=read(),k=read();
	for(int i=1;i<=n;i++){
		insert();
		W((*--S.end()).sze),putchar(' ');
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章