T1标程
```cpp
#include <bits/stdc++.h>
#include <tr1/unordered_map>
#define REP( i , l , r ) for( int i = (l) ; i <= (r) ; i++ )
using namespace std;
inline int _read(){
register int x = 0 , f = 1;
register char ch = getchar();
while( ch > '9' || ch < '0' ) { if( ch == '-' ) f = -1; ch = getchar(); }
while( ch >= '0' && ch <= '9' ){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
int N , M;
const int maxn = 300000 + 5;
const int INF = 0x7f7f7f7f;
int a[maxn] , b[maxn];
int c[maxn] , pos = 0;
int g[maxn] ;
tr1::unordered_map<int , int> _hash;
int main(){
N = _read() , M = _read();
REP( i , 0 , N - 1 ) a[i] = _read();
REP( j , 0 , M - 1 ) b[j] = _read();
REP( i , 0 , N - 1 ) _hash.insert( make_pair(a[i] , i) );
REP( i , 0 , M - 1 )
if( _hash.count(b[i]) ) { c[pos++] = _hash[b[i]]; }
int ans = 1;
REP( i , 0 , N ) g[i] = INF;
REP( i , 0 , pos - 1 ){
int k = lower_bound( g + 1 , g + N + 1 , c[i] ) - g;
g[k] = c[i]; ans = max( ans , k );
}
cout << ans << endl;
return 0;
}
```
by eternal @ 2016-10-04 21:16:24
前排滋瓷!
by winmt @ 2016-10-04 21:16:28
T2
```cpp
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define red(i, a, b) for(int i = (a); i >= (b); i--)
#define LD long double
#define ll long long
#define abs ABS
#define sqr SQR
#define PII pair<int, int>
#define MP make_pair
#define PB push_back
#define FI first
#define SE second
template<typename tn> void read(tn& a) {
tn x = 0, f = 1; char c = getchar();
while(!isdigit(c)) {
if (c == '-') f = -1;
c = getchar();
}
while(isdigit(c)) x = x * 10 + c - '0', c = getchar();
a = x * f;
}
template<typename tn> void cmax(tn& a, tn b) { if (b > a) a = b; }
template<typename tn> void cmin(tn& a, tn b) { if (b < a) a = b; }
template<typename tn> tn abs(tn a) { return a < 0 ? -a : a; }
template<typename tn> tn sqr(tn a) { return a * a; }
const int N = 110000;
const ll inf = 1000000000ll * 1000000000ll + 10ll;
struct Edge {
int from, to, len, nxt;
}E[N << 1];
int head[N], vis[N];
ll d[N];
struct Node {
int x;
ll dis;
};
bool operator < (Node a, Node b) { return a.dis < b.dis; }
bool operator > (Node a, Node b) { return a.dis > b.dis; }
priority_queue< Node, vector<Node>, greater<Node> > q;
ll h;
int x, y, z, tail = 0;
inline void addEdge(int from, int to, int len) {
E[++tail] = (Edge){from, to, len, head[from]};
head[from] = tail;
}
inline void Dijkstra() {
rep(i, 0, x) d[i] = inf;
d[1 % x] = 1;
q.push((Node){1 % x, d[1 % x]});
while(!q.empty()) {
Node now = q.top();
while(vis[now.x]) {
q.pop();
if (q.empty()) return;
now = q.top();
}
q.pop();
int x = now.x; vis[x] = 1;
for(int i = head[x]; i != -1; i = E[i].nxt) {
int v = E[i].to;
if (vis[v] || d[x] + E[i].len > h) continue;
if (d[x] + E[i].len < d[v]) {
d[v] = d[x] + E[i].len;
q.push((Node){v, d[v]});
}
}
}
}
int main() {
read(h);
read(x); read(y); read(z);
rep(i, 0, x) head[i] = -1;
rep(i, 0, x - 1) {
addEdge(i, (i + y) % x, y);
addEdge(i, (i + z) % x, z);
}
Dijkstra();
ll ans = 0;
rep(i, 0, x - 1) {
if (d[i] > h) continue;
ans += (h - d[i]) / x + 1;
}
cout << ans << endl;
return 0;
}
```
by eternal @ 2016-10-04 21:17:01
T3
```cpp
#include <bits/stdc++.h>
#define REP( i , l , r ) for( int i = (l) ; i <= (r) ; i++ )
using namespace std;
typedef long long ll;
inline int _read(){
int x = 0;
char ch = getchar();
while( ch < '0' || ch > '9' ) ch = getchar();
while( ch >='0' && ch <='9' ){
x = x * 10 + ch - '0';
ch = getchar();
}
return x;
}
const int MOD = 1e9 + 9;
const int maxn = 300000;
ll bas = 276601605 , q1 = 691504013 , q2 = 308495997;
ll mul1[maxn] , mul2[maxn] , s[maxn];
int c[maxn] , N , K ;
struct node{
ll a , b ;
ll sum;
} t[maxn * 4];
void prework( int M ){
mul1[0] = mul2[0] = 1;
REP( i , 1 , M ){
mul1[i] = mul1[i - 1] * q1 % MOD;
mul2[i] = mul2[i - 1] * q2 % MOD;
}
}
void build( int x , int l , int r ){
t[x].a = t[x].b = t[x].sum = 0;
if( l == r ) return;
int mid = ( l + r ) >> 1;
build( x << 1 , l , mid );
build( (x << 1) + 1 , mid + 1 , r );
}
void push_down( int x , int l , int r ){
ll aa = t[x].a , bb = t[x].b;
if( 0 == aa && 0 == bb ) return;
int lc = x << 1 , rc = (x << 1) | 1 , mid = (l + r) >> 1;
int l1 = mid - l + 1 , l2 = r - mid;
t[lc].a = (t[lc].a + aa) % MOD;
t[lc].b = (t[lc].b + bb) % MOD;
t[lc].sum = ( t[lc].sum + aa * (mul1[l1 + 2] - mul1[2]) ) % MOD;
t[lc].sum = ( t[lc].sum - bb * (mul2[l1 + 2] - mul2[2]) ) % MOD;
t[rc].a = ( t[rc].a + aa * mul1[l1] ) % MOD;
t[rc].b = ( t[rc].b + bb * mul2[l1] ) % MOD;
t[rc].sum = ( t[rc].sum + aa * mul1[l1] % MOD * (mul1[l2 + 2] - mul1[2] ) % MOD ) % MOD;
t[rc].sum = ( t[rc].sum - bb * mul2[l1] % MOD * (mul2[l2 + 2] - mul2[2] ) % MOD ) % MOD;
t[x].a = t[x].b = 0;
}
void push_up( int x ){
t[x].sum = ( t[x << 1].sum + t[(x << 1) + 1].sum ) % MOD;
}
ll query( int x , int l , int r , int ql , int qr ){
if( l == ql && r == qr ) return t[x].sum;
push_down( x , l , r );
int mid = (l + r) >> 1;
if( qr <= mid ) return query( x << 1 , l , mid , ql , qr );
else if( ql > mid ) return query( (x << 1) | 1 , mid + 1 , r , ql , qr );
else return (query( x << 1 , l , mid , ql , mid ) + query( (x << 1) | 1 , mid + 1 , r , mid + 1 , qr )) % MOD;
}
void update( int rt , int l , int r , int ql , int qr , ll x , ll y ){
if( l == ql && r == qr ){
int len = r - l + 1;
t[rt].a = (t[rt].a + x) % MOD;
t[rt].b = (t[rt].b + y) % MOD;
t[rt].sum = ( t[rt].sum + x * (mul1[len + 2] - mul1[2]) ) % MOD;
t[rt].sum = ( t[rt].sum - y * (mul2[len + 2] - mul2[2]) ) % MOD;
return;
}
push_down( rt , l , r );
int mid = (l + r) >> 1;
if( qr <= mid ) update( (rt << 1) , l , mid , ql , qr , x , y );
else if( ql > mid ) update( (rt << 1) | 1 , mid + 1 , r , ql , qr , x , y );
else{
int len = mid - ql + 1;
update( rt << 1 , l , mid , ql , mid , x , y );
update( (rt << 1) | 1 , mid + 1 , r , mid + 1 , qr , x * mul1[len] % MOD , y * mul2[len] % MOD );
}
push_up( rt );
}
int main(){
N = _read() , K = _read();
REP( i , 1 , N ){
c[i] = _read();
s[i] = s[i - 1] + c[i];
}
prework( 60200 );
build( 1 , 1 , N );
REP( i , 1 , K ){
int opt , l , r;
opt = _read() , l = _read() , r = _read();
if( opt == 1 ) update( 1 , 1 , N , l , r , 1 , 1 );
else{
ll ret = ( bas * query( 1 , 1 , N , l , r ) % MOD + s[r] - s[l - 1] ) % MOD;
if( ret < 0 ) ret += MOD;
printf( "%lld\n" , ret );
}
}
return 0;
}
```
by eternal @ 2016-10-04 21:17:45
T3NO2
```cpp
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define red(i, a, b) for(int i = (a); i >= (b); i--)
#define LD long double
#define ll long long
#define abs ABS
#define sqr SQR
#define PII pair<int, int>
#define MP make_pair
#define PB push_back
#define FI first
#define SE second
template<typename tn> void read(tn& a) {
tn x = 0, f = 1; char c = getchar();
while(!isdigit(c)) {
if (c == '-') f = -1;
c = getchar();
}
while(isdigit(c)) x = x * 10 + c - '0', c = getchar();
a = x * f;
}
template<typename tn> void cmax(tn& a, tn b) { if (b > a) a = b; }
template<typename tn> void cmin(tn& a, tn b) { if (b < a) a = b; }
template<typename tn> tn abs(tn a) { return a < 0 ? -a : a; }
template<typename tn> tn sqr(tn a) { return a * a; }
const int N = 110000;
const ll mod = 1000000009;
struct Node {
int l, r;
ll sum, f1, f2;
}t[N * 4];
int n, m;
ll a[N], F[N];
void Build(int x, int l, int r) {
int mid = (l + r) >> 1, lc = x << 1, rc = lc + 1;
t[x].l = l; t[x].r = r;
t[x].f1 = t[x].f2 = 0;
if (l == r) {
t[x].sum = a[l];
return;
}
Build(lc, l, mid); Build(rc, mid + 1, r);
t[x].sum = (t[lc].sum + t[rc].sum) % mod;
}
inline ll getH(ll a, ll b, ll n) {
if (n == 1) return a;
if (n == 2) return b;
return (a * F[n - 2] % mod + b * F[n - 1] % mod) % mod;
}
inline ll SUM(ll a, ll b, ll n) {
if (n == 1) return a;
if (n == 2) return (a + b) % mod;
return (getH(a, b, n + 2) - b + mod) % mod;
}
void pushdown(int x) {
int l = t[x].l, r = t[x].r;
int mid = (l + r) >> 1, lc = x << 1, rc = lc + 1;
(t[lc].f1 += t[x].f1) %= mod;
(t[lc].f2 += t[x].f2) %= mod;
(t[lc].sum += SUM(t[x].f1, t[x].f2, mid - l + 1)) %= mod;
(t[rc].f1 += getH(t[x].f1, t[x].f2, mid - l + 2)) %= mod;
(t[rc].f2 += getH(t[x].f1, t[x].f2, mid - l + 3)) %= mod;
t[rc].sum += SUM(t[x].f1, t[x].f2, r - l + 1) - SUM(t[x].f1, t[x].f2, mid - l + 1);
(t[rc].sum += mod) %= mod;
t[x].f1 = t[x].f2 = 0;
}
void update(int x, int l, int r, int ql, int qr) {
int mid = (l + r) >> 1, lc = x << 1, rc = lc + 1;
if (ql <= l && r <= qr) {
(t[x].f1 += F[l - ql + 1]) %= mod;
(t[x].f2 += F[l - ql + 2]) %= mod;
(t[x].sum += SUM(F[l - ql + 1], F[l - ql + 2], r - l + 1)) %= mod;
return;
}
pushdown(x);
if (ql <= mid) update(lc, l, mid, ql, qr);
if (qr > mid) update(rc, mid + 1, r, ql, qr);
t[x].sum = (t[lc].sum + t[rc].sum) % mod;
return;
}
ll query(int x, int l, int r, int ql, int qr) {
int mid = (l + r) >> 1, lc = x << 1, rc = lc + 1;
if (ql <= l && r <= qr) return t[x].sum;
pushdown(x);
if (qr <= mid) return query(lc, l, mid, ql, qr);
else if (ql > mid) return query(rc, mid + 1, r, ql, qr);
else return (query(lc, l, mid, ql, qr) + query(rc, mid + 1, r, ql, qr)) % mod;
}
int main() {
read(n); read(m);
rep(i, 1, n) read(a[i]);
F[1] = F[2] = 1;
rep(i, 3, n + 10) F[i] = (F[i - 1] + F[i - 2]) % mod;
Build(1, 1, n);
rep(i, 1, m) {
int tp, l, r;
read(tp); read(l); read(r);
if (tp == 1) update(1, 1, n, l, r);
else printf("%lld\n", query(1, 1, n, l, r));
}
return 0;
}
```
by eternal @ 2016-10-04 21:26:00
根本看不懂(我是学pascal)
by wowwow @ 2016-10-04 22:06:11
```cpp
pas No1const
maxn=300000;
var
n,m,i,j,all,t,ans:longint;
a,b,e,f,g:array[1..maxn] of longint;
hash:array[1..maxn*2] of longint;
c,d:array[1..maxn*2] of longint;
function func(x:longint):longint;
var
l,r,mid:longint;
begin
if ans=0
then exit(0);
l:=0;r:=ans;
while l<r do
begin
mid:=(l+r+1) div 2;
if x>=g[mid]
then l:=mid
else r:=mid-1;
end;
exit(l);
end;
function max(x,y:longint):longint;
begin
```
if x>y
```cpp
then exit(x)
else exit(y);
end;
procedure sort(l,r:longint);
var
i,j,x,y:longint;
begin
i:=l;
j:=r;
x:=c[(l+r) div 2];
repeat
while c[i]<x do
inc(i);
while x<c[j] do
dec(j);
if not(i>j)
then begin
y:=c[i];
c[i]:=c[j];
c[j]:=y;
y:=d[i];
d[i]:=d[j];
d[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j
then sort(l,j);
if i<r
then sort(i,r);
end;
begin
read(n,m);
for i:=1 to n do
begin
read(a[i]);
c[i]:=a[i];
d[i]:=i;
end;
for i:=1 to m do
begin
read(b[i]);
c[i+n]:=b[i];
d[i+n]:=i+n;
end;
sort(1,n+m);
all:=0;
for i:=1 to n+m do
begin
if (i=1)or(c[i]<>c[i-1])
then inc(all);
if d[i]<=n
then a[d[i]]:=all
else b[d[i]-n]:=all;
end;
for i:=1 to n do
hash[a[i]]:=i;
for i:=1 to m do
if hash[b[i]]<>0
then e[hash[b[i]]]:=i;
ans:=0;
for i:=1 to n do
begin
if e[i]=0
then continue;
t:=func(e[i])+1;
f[i]:=t;
```
if t>ans
```cpp
then ans:=t;
if (g[t]=0)or(e[i]<g[t])
then g[t]:=e[i];
end;
writeln(ans);
end.
```
by eternal @ 2016-10-04 22:25:52
pas T2
```cpp
const
maxv=100000;
maxq=10000000;
var
n,ans,x,y,z,t,m,l,r:int64;
i:longint;
a,b:array[0..maxv] of int64;
q:array[1..maxq] of int64;
procedure func(var x,y,z:int64);
var
t:int64;
begin
if x>y then begin t:=x;x:=y;y:=t;end;
if y>z then begin t:=y;y:=z;z:=t;end;
if x>y then begin t:=x;x:=y;y:=t;end;
end;
begin
read(n,x,y,z);
func(x,y,z);
if x=1
then begin writeln(n);exit;end;
l:=1;r:=1;
a[1]:=1;
b[1]:=1;
q[1]:=1;
while not((l=r+1)or(r=maxq)and(l=1)) do
begin
if b[q[l]]=1
then begin
t:=a[q[l]]+y;
m:=t mod x;
if (t<=n)and((a[m]=0)or(a[m]>t))
then begin
a[m]:=t;
inc(b[m]);
inc(r);
```
if r>maxq
```cpp
then r:=1;
q[r]:=m;
end;
t:=a[q[l]]+z;
m:=t mod x;
if (t<=n)and((a[m]=0)or(a[m]>t))
then begin
a[m]:=t;
inc(b[m]);
inc(r);
```
if r>maxq
```cpp
then r:=1;
q[r]:=m;
end;
end;
dec(b[q[l]]);
inc(l);
```
if l>maxq
```cpp
then l:=1;
end;
for i:=0 to x-1 do
if a[i]<>0
then inc(ans,(n-a[i]) div x+1);
writeln(ans);
end.
```
by eternal @ 2016-10-04 22:26:35
pas T3
```cpp
const
v=1000000009;
maxn=100000;
type
node=record
lc:longint;
rc:longint;
t1:int64;
t2:int64;
sum:int64;
end;
var
n,m,i,c,l,r,all:longint;
x,f,s:array[0..maxn] of int64;
a:array[1..maxn*2] of node;
function cal(x,y,z:int64):int64;
var
sa,sb:int64;
begin
if z=2
then exit(x+y);
sa:=f[z];
sb:=s[z-1];
exit((sa*x+sb*y) mod v);
end;
function get(x,y,z:int64):int64;
begin
exit((x*f[z-2]+y*f[z-1]) mod v);
end;
procedure pushdown(i,l,r:longint);
var
mid,x,y:longint;
t1,t2:int64;
begin
mid:=(l+r) div 2;
x:=a[i].lc;y:=a[i].rc;
a[x].t1:=(a[x].t1+a[i].t1) mod v;
a[x].t2:=(a[x].t2+a[i].t2) mod v;
a[x].sum:=(a[x].sum+cal(a[i].t1,a[i].t2,mid-l+1)) mod v;
t1:=get(a[i].t1,a[i].t2,mid-l+2);
t2:=get(a[i].t1,a[i].t2,mid-l+3);
a[y].t1:=(a[y].t1+t1) mod v;
a[y].t2:=(a[y].t2+t2) mod v;
a[y].sum:=(a[y].sum+cal(t1,t2,r-mid)) mod v;
a[i].t1:=0;
a[i].t2:=0;
end;
procedure maintain(i,l,r,ql,qr:longint;t1,t2:int64);
var
mid:longint;
begin
if l=r
then begin
a[i].sum:=(a[i].sum+t1) mod v;
exit;
end;
if (l=ql)and(r=qr)
then begin
a[i].t1:=(a[i].t1+t1) mod v;
a[i].t2:=(a[i].t2+t2) mod v;
a[i].sum:=(a[i].sum+cal(t1,t2,r-l+1)) mod v;
exit;
end;
mid:=(l+r) div 2;
a[i].sum:=(a[i].sum+cal(t1,t2,qr-ql+1)) mod v;
pushdown(i,l,r);
if qr<=mid
then maintain(a[i].lc,l,mid,ql,qr,t1,t2)
else if ql>mid
then maintain(a[i].rc,mid+1,r,ql,qr,t1,t2)
else begin
maintain(a[i].lc,l,mid,ql,mid,t1,t2);
maintain(a[i].rc,mid+1,r,mid+1,qr,get(t1,t2,mid-ql+2),get(t1,t2,mid-ql+3));
end;
end;
procedure build(i,l,r:longint);
var
mid:longint;
begin
if l=r
then begin
a[i].sum:=x[l];
exit;
end;
mid:=(l+r) div 2;
inc(all);
a[i].lc:=all;
build(all,l,mid);
inc(all);
a[i].rc:=all;
build(all,mid+1,r);
a[i].sum:=(a[a[i].lc].sum+a[a[i].rc].sum) mod v;
end;
function query(i,l,r,ql,qr:longint):longint;
var
mid:longint;
begin
if (l=ql)and(r=qr)
then exit(a[i].sum);
mid:=(l+r) div 2;
pushdown(i,l,r);
if qr<=mid
then exit(query(a[i].lc,l,mid,ql,qr))
else if ql>mid
then exit(query(a[i].rc,mid+1,r,ql,qr))
else exit((query(a[i].lc,l,mid,ql,mid)+query(a[i].rc,mid+1,r,mid+1,qr)) mod v);
end;
begin
read(n,m);
for i:=1 to n do
read(x[i]);
f[1]:=1;
f[2]:=1;
for i:=3 to n do
f[i]:=(f[i-1]+f[i-2]) mod v;
s[1]:=f[1];
for i:=2 to n do
s[i]:=(s[i-1]+f[i]) mod v;
all:=1;
build(1,1,n);
for i:=1 to m do
begin
read(c,l,r);
case c of
1:maintain(1,1,n,l,r,1,1);
2:writeln(query(1,1,n,l,r));
end;
end;
end.
```
by eternal @ 2016-10-04 22:27:11
##这.........
by wowwow @ 2016-10-05 11:06:06