結果
| 問題 |
No.1079 まお
|
| コンテスト | |
| ユーザー |
snuke
|
| 提出日時 | 2020-06-12 22:22:35 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,924 ms / 2,000 ms |
| コード長 | 4,452 bytes |
| コンパイル時間 | 4,162 ms |
| コンパイル使用メモリ | 215,848 KB |
| 最終ジャッジ日時 | 2025-01-11 02:40:34 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 30 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:153:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
153 | scanf("%d%d",&n,&k);
| ~~~~~^~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h>
#define fi first
#define se second
#define rep(i,n) for(int i = 0; i < (n); ++i)
#define rrep(i,n) for(int i = 1; i <= (n); ++i)
#define drep(i,n) for(int i = (n)-1; i >= 0; --i)
#define srep(i,s,t) for (int i = s; i < t; ++i)
#define rng(a) a.begin(),a.end()
#define rrng(a) a.rbegin(),a.rend()
#define maxs(x,y) (x = max(x,y))
#define mins(x,y) (x = min(x,y))
#define isin(x,l,r) ((l) <= (x) && (x) < (r))
#define pb push_back
#define eb emplace_back
#define sz(x) (int)(x).size()
#define pcnt __builtin_popcountll
#define uni(x) x.erase(unique(rng(x)),x.end())
#define snuke srand((unsigned)clock()+(unsigned)time(NULL));
#define show(x) cout<<#x<<" = "<<x<<endl;
#define PQ(T) priority_queue<T,v(T),greater<T> >
#define bn(x) ((1<<x)-1)
#define dup(x,y) (((x)+(y)-1)/(y))
#define newline puts("")
#define v(T) vector<T>
#define vv(T) v(v(T))
using namespace std;
typedef long long int ll;
typedef unsigned uint;
typedef unsigned long long ull;
typedef pair<int,int> P;
typedef tuple<int,int,int> T;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<P> vp;
typedef vector<T> vt;
inline int getInt() { int x; scanf("%d",&x); return x;}
template<typename T>inline istream& operator>>(istream&i,v(T)&v)
{rep(j,sz(v))i>>v[j];return i;}
template<typename T>string join(const v(T)&v)
{stringstream s;rep(i,sz(v))s<<' '<<v[i];return s.str().substr(1);}
template<typename T>inline ostream& operator<<(ostream&o,const v(T)&v)
{if(sz(v))o<<join(v);return o;}
template<typename T1,typename T2>inline istream& operator>>(istream&i,pair<T1,T2>&v)
{return i>>v.fi>>v.se;}
template<typename T1,typename T2>inline ostream& operator<<(ostream&o,const pair<T1,T2>&v)
{return o<<v.fi<<","<<v.se;}
template<typename T>inline ll suma(const v(T)& a) { ll res(0); for (auto&& x : a) res += x; return res;}
const double eps = 1e-10;
const ll LINF = 1001002003004005006ll;
const int INF = 1001001001;
#define dame { puts("-1"); return 0;}
#define yn {puts("Yes");}else{puts("No");}
const int MX = 200005;
typedef v(vl) vvl;
// coordinate compression
struct X {
typedef int T;
vector<T> d;
X() {}
X(vector<T>& a): d(a) {
init();
for (T& na : a) na = (*this)(na);
}
void add(const T& x) { d.pb(x);}
void init() {
sort(rng(d));
d.erase(unique(rng(d)), d.end());
}
int size() const { return sz(d);}
T operator[](int i) const { return d[i];}
int operator()(const T& x) const { return upper_bound(rng(d),x)-d.begin()-1;}
int get(int x) {
int i = upper_bound(rng(d),x)-d.begin()-1;
if (i == sz(d)) return -1;
if (d[i] != x) return -1;
return i;
}
} xs;
//
// sparse table
int bsr(uint x) { return 31^__builtin_clz(x);}
struct Sparse {
typedef P Int;
int n;
vv(Int) x;
Sparse(int n=0):n(n),x(1,v(Int)(n)) {}
Sparse(v(Int)& a):n(sz(a)),x(1,a) { init();}
void init() {
int i = 0;
for (int w = 2; w <= n; w <<= 1) {
x.pb(v(Int)(n-w+1));
rep(j,sz(x.back())) {
x.back()[j] = min(x[i][j], x[i][j+(w>>1)]);
}
++i;
}
}
Int get(int l, int r) {
if (l >= r) return P(INF,l); // INF!!
int i = bsr(r-l);
return min(x[i][l], x[i][r-(1<<i)]);
}
} s;
vvi is;
vvl iss;
typedef pair<int,ll> LP;
LP get(int x, int r) {
int i = lower_bound(rng(is[x]), r) - is[x].begin();
return LP(i,iss[x][i]);
}
LP get(int x, int l, int r) {
LP a = get(x,l);
LP b = get(x,r);
return LP(b.fi-a.fi, b.se-a.se);
}
int n;
int k;
vi a;
ll ans;
void dfs(int l, int r) {
if (l == r) return;
int c = s.get(l,r).se;
int rc = s.get(c+1,r).se;
if (c+1 == r || rc == r || a[c] != a[rc]) rc = r;
if (c-l < rc-c) {
srep(i,l,c+1) {
int ni = xs.get(k-xs[a[i]]);
if (ni == -1) continue;
LP p = get(ni,c,rc);
ans += p.se;
ans -= ll(i-1)*p.fi;
}
} else {
srep(i,c,rc) {
int ni = xs.get(k-xs[a[i]]);
if (ni == -1) continue;
LP p = get(ni,l,c+1);
ans += ll(i+1)*p.fi;
ans -= p.se;
}
}
cerr<<l<<" "<<r<<" "<<c<<" "<<rc<<" "<<ans<<endl;
dfs(l,c);
dfs(c+1,r);
}
int main() {
scanf("%d%d",&n,&k);
a = vi(n);
cin>>a;
xs = X(a);
s = Sparse(n);
rep(i,n) s.x[0][i] = P(a[i],i);
is = vvi(sz(xs));
iss = vvl(sz(xs),vl(1));
rep(i,n) is[a[i]].pb(i);
rep(i,n) iss[a[i]].pb(i);
rep(i,sz(xs)) {
rep(j,sz(iss[i])-1) iss[i][j+1] += iss[i][j];
}
s.init();
dfs(0,n);
cout<<ans<<endl;
return 0;
}
snuke