The 2019 China Collegiate Programming Contest Harbin Site题解(EFIJK)

The 2019 China Collegiate Programming Contest Harbin Site题解(EFIJK)_第1张图片
太惨了QAQ
I题
The 2019 China Collegiate Programming Contest Harbin Site题解(EFIJK)_第2张图片
只需要考虑到相邻的数相等的情况,以及不等点,每个不等点必定对应的是当前的最大/ 最小的选择,
其余的就是没用到的可以在相等的情况下任意分配。

 #include
#include
#include
#include
#include
#include
#include
#include 
#include 
#include 
#define ll long long
#define int long long
#define inf 0x3f3f3f3f
#define mods 1000000007
#define modd 998244353
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
 ll gcd(ll a,ll b){if(a<0)a=-a;if(b<0)b=-b;return b==0?a:gcd(b,a%b);}
template<typename T>void read(T &res){bool flag=false;char ch;while(!isdigit(ch=getchar()))(ch=='-')&&(flag=true);
for(res=ch-48;isdigit(ch=getchar());res=(res<<1)+(res<<3)+ch - 48);flag&&(res=-res);}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
ll qp(ll a,ll b,ll mod){ll ans=1;if(b==0){return ans%mod;}while(b){if(b%2==1){b--;ans=ans*a%mod;}a=a*a%mod;b=b/2;}return ans%mod;}//快速幂%
ll qpn(ll a,ll b, ll p){ll ans = 1;a%=p;while(b){if(b&1){ans = (ans*a)%p;--b;}a =(a*a)%p;b >>= 1;}return ans%p;}//逆元   (分子*qp(分母,mod-2,mod))%mod;

const int mx = 1e5 + 10;
int n,m;
int a[mx];
signed main() {
	ll t;
	read(t);
	while (t--) {
    read(n);
		for (int i=1;i<=n;i++) {
		read(a[i]);
		}
		ll ans = 1;
		ll cnt = 0;
		if (a[1] != 0 || a[n] != n-1) ans = 0;
		for (int i=2;i<=n;i++) {
			if (a[i]<a[i-1]) ans = 0;
			if (a[i]==a[i-1]) {
				ans = ans*(cnt--)%mods;
			} else {
				ans = ans*2%mods;
				cnt += a[i] - a[i-1] - 1;
			}
		}
		printf("%lld\n",ans%mods);
	}
    return 0;
}

FJK太简单了 。。。。 基本上模拟模拟就过了

E题倒推,但是emmm时间卡的太严格了

你可能感兴趣的:(算法)