。。。 后面四个小时都在挂机很难受。
1010
裸的逆序对
//#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack-protector") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") //#pragma GCC optimize("unroll-loops") #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define vi vector<int> #define mod 1000000007 #define ld long double #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pll pair<ll,ll> #define pil pair<int,ll> #define pli pair<ll,int> #define pii pair<int,int> #define cd complex<double> #define ull unsigned long long #define base 1000000000000000000 #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define fio ios::sync_with_stdio(false);cin.tie(0) inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;} inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;} inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;} using namespace std; const double eps=1e-8; const ll INF=0x3f3f3f3f3f3f3f3f; const int N=500000+10,maxn=50000+10,inf=0x3f3f3f3f; struct BIT{ ll sum[N]; void add(int i,int v) { for(;i<N;i+=i&(-i))sum[i]+=v; } ll query(int i) { ll ans=0; for(;i;i-=i&(-i))ans+=sum[i]; return ans; } }b; int Hash[N],a[N]; int main() { int n,x,y; while(~scanf("%d%d%d",&n,&x,&y)) { memset(b.sum,0,sizeof b.sum); int cnt=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); Hash[cnt++]=a[i]; } sort(Hash,Hash+cnt); cnt=unique(Hash,Hash+cnt)-Hash; ll ans=0; for(int i=1;i<=n;i++) { a[i]=lower_bound(Hash,Hash+cnt,a[i])-Hash+1; // printf("%d ",a[i]); b.add(a[i],1); ans+=b.query(cnt+5)-b.query(a[i]); } // puts(""); printf("%lld ",ans*min(x,y)); } return 0; } /******************** ********************/
1004
因为1的存在所以先手必胜
1007
因为序列b为 1, 2, 3, 4, 5, 6 .... n, 所以所有点的更新次数不超过 m/1 + m/2 + m/3 .... + m/n = mlogm,
所以就是暴力扣出要更新的点更新就好啦。 天天写搓lazy,反思一下。。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int, int> using namespace std; const int N = 1e5 + 7; const int M = 1e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 +7; int n, q, b[N], mx[N << 2], lazy[N << 2], stk[N], tot; char s[N]; struct BIT { int a[N]; void init() { memset(a, 0, sizeof(a)); } void modify(int x, int v) { for(int i = x; i <= n; i += i & -i) a[i] += v; } int query(int x) { int ans = 0; for(int i = x; i; i -= i & -i) ans += a[i]; return ans; } } bit; void build(int l, int r, int rt) { lazy[rt] = 0; if(l == r) { mx[rt] = -b[l]; return; } int mid = l + r >> 1; build(l, mid, rt << 1); build(mid + 1, r, rt << 1 | 1); mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]); } void pushdown(int rt) { if(lazy[rt] != 0) { lazy[rt << 1] += lazy[rt]; lazy[rt << 1 | 1] += lazy[rt]; mx[rt << 1] += lazy[rt]; mx[rt << 1 | 1] += lazy[rt]; lazy[rt] = 0; } } void update(int L, int R, int v, int l, int r, int rt) { if(l >= L && r <= R) { lazy[rt] += v; mx[rt] += v; return; } int mid = l + r >> 1; pushdown(rt); if(L <= mid) update(L, R, v, l, mid, rt << 1); if(R > mid) update(L, R, v, mid + 1, r, rt << 1 | 1); mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]); } void solve(int l, int r, int rt) { if(mx[rt] < 0) return; if(l == r) { stk[tot++] = l; return; } int mid = l + r >> 1; pushdown(rt); solve(l, mid, rt << 1); solve(mid + 1, r, rt << 1 | 1); } int main() { while(scanf("%d%d", &n, &q) != EOF) { bit.init(); for(int i = 1; i <= n; i++) { scanf("%d", &b[i]); } build(1, n, 1); while(q--) { int l, r; scanf("%s%d%d", s, &l, &r); if(s[0] == 'a') { update(l, r, 1, 1, n, 1); tot = 0; solve(1, n, 1); for(int i = 0; i < tot; i++) { update(stk[i], stk[i], -b[stk[i]], 1, n, 1); bit.modify(stk[i], 1); } } else { printf("%d ", bit.query(r) - bit.query(l - 1)); } } } return 0; } /* */
补题-----------------------------------------------------------------
1005
比赛的时候一直构造不出来。。 很神奇的构造方法。。。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int, int> using namespace std; const int N = 3000 + 7; const int M = 1e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 +7; int a[N][N]; int main() { int p = 47; for(int i = 0; i < p; i++) { for(int j = 0; j < p; j++) { for(int k = 0; k < p; k++) { a[i * p + j][k * p + (j * k + i) % p] = 1; } } } puts("2000"); for(int i = 0; i < 2000; i++) { for(int j = 0; j < 2000; j++) { printf("%d", a[i][j]); } puts(""); } return 0; } /* */
1003
后面一直在写这个题, 构造虚拟点,去掉多余的边,方法都想出来了,可能是对欧拉回路不够了解,一直没a,后来队友补了。