QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#591741 | #8781. Element-Wise Comparison | ericmegalovania | WA | 238ms | 308884kb | C++20 | 3.5kb | 2024-09-26 17:32:04 | 2024-09-26 17:32:05 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
//#define ONLINE
#ifndef ONLINE
char DEBUG_BUFFER[1000];
#define debug(...) {sprintf(DEBUG_BUFFER,##__VA_ARGS__);\
cerr<<"\033[1;36m"<<DEBUG_BUFFER<<"\033[0;2m"<<"\033[0m";}
#else
#define debug(...) ;
#endif
using LL=long long;
using PII=pair<int,int>;
#define all(x) (x).begin(),(x).end()
#define allr(x) (x).rbegin(),(x).rend()
#define FAST_IO {ios::sync_with_stdio(false);cin.tie(nullptr);}
inline int read(){static int x; cin>>x; return x;}
inline LL readLL(){static LL x; cin>>x; return x;}
mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count());
using u128=__uint128_t;
inline int u128_count(const u128& x){
static const unsigned long long o=1,low=(o<<63)-1+(o<<63);
return __builtin_popcountll((LL)(x>>64))+
__builtin_popcount((LL)(x&low));
}
template<int N_>
struct Bitset{
static const int N=(N_-1)/128+1,back_siz=N_-(N-1)*128;
static const u128 o=1,set_last=(o<<back_siz-1)-1+(o<<back_siz-1);
u128 a[N];
inline void reset(){
memset(a,0,sizeof(a));
}
inline void set(){
memset(a,0xff,sizeof(a));
a[N-1]=set_last;
}
inline Bitset(const bool& _=0){
_?set():reset();
}
inline void flip(int x){
a[x>>7]^=o<<(x&127);
}
inline void reset(int x){
a[x>>7]&=~(o<<(x&127));
}
inline void set(int x){
a[x>>7]|=o<<(x&127);
}
inline int test(int x){
return (a[x>>7]>>(x&127))&1;
}
inline Bitset operator ~() const{
Bitset ret(N);
for(int i=0;i<N;i++){
ret.a[i]=~a[i];
}
return ret;
}
inline Bitset operator &(const Bitset &b) const{
Bitset ret(N);
for(int i=0;i<N;i++){
ret.a[i]=a[i]&b.a[i];
}
return ret;
}
inline Bitset operator |(const Bitset &b) const{
Bitset ret;
for(int i=0;i<N;i++){
ret.a[i]=a[i]|b.a[i];
}
return ret;
}
inline Bitset operator ^(const Bitset &b) const{
Bitset ret;
for(int i=0;i<N;i++){
ret.a[i]=a[i]^b.a[i];
}
return ret;
}
inline Bitset operator <<(const int& t) const{
Bitset ret;
u128 last=0;
int high=t>>7,low=t&127;
for(int i=0;i+high<N;i++){
ret.a[i+high]=last|(a[i]<<low);
if(low) last=a[i]>>(128-low);
}
return ret;
}
inline Bitset operator >>(const int& t) const{
Bitset ret;
u128 last=0;
int high=t>>7,low=t&127;
for(int i=N-1;i>=high;i--){
ret.a[i-high]=last|(a[i]>>low);
if(low) last=a[i]<<(128-low);
}
return ret;
}
inline string str() const{
string s="";
for(int j=back_siz-1;j>=0;j--){
s.push_back('0'+(a[N-1]>>j&1));
}
for(int i=N-2;i>=0;i--){
for(int j=127;j>=0;j--){
s.push_back('0'+(a[i]>>j&1));
}
}
return s;
}
inline int count() const{
int ret=0;
for(int i=0;i<N;i++){
ret+=u128_count(a[i]);
}
return ret;
}
};
#define N 50001
int main(){
FAST_IO;
int n=read(),m=read();
vector<int>pos(n);
for(int i=0;i<n;i++){
pos[read()-1]=i;
}
vector<Bitset<N>>f(n),suf(m);
Bitset<N>tmp;
for(int x=n-1;x>=0;x--){
f[pos[x]]=tmp>>pos[x];
tmp.set(pos[x]);
}
LL ans=0;
for(int i=0,last=-1;i<n-m+1;i++){
if(i>last){
last+=m;
suf[0]=f[last];
for(int j=1;j<m;j++){
suf[j]=suf[j-1]&f[last-j];
}
tmp.set();
}
ans+=(suf[last-i]&tmp).count();
if(i+m<n) tmp=tmp&f[i+m];
}
cout<<ans;
return 0;
}
/* stuff you should look for
* int overflow, array bounds
* special cases (n=1?)
* do smth instead of nothing and stay organized
* WRITE STUFF DOWN
* DON'T GET STUCK ON ONE APPROACH
*/
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3628kb
input:
5 3 5 2 1 3 4
output:
0
result:
ok answer is '0'
Test #2:
score: 0
Accepted
time: 0ms
memory: 3836kb
input:
5 2 3 1 4 2 5
output:
2
result:
ok answer is '2'
Test #3:
score: 0
Accepted
time: 1ms
memory: 3908kb
input:
4 2 1 2 3 4
output:
3
result:
ok answer is '3'
Test #4:
score: 0
Accepted
time: 1ms
memory: 3832kb
input:
4 2 4 3 2 1
output:
0
result:
ok answer is '0'
Test #5:
score: 0
Accepted
time: 0ms
memory: 3640kb
input:
1 1 1
output:
0
result:
ok answer is '0'
Test #6:
score: -100
Wrong Answer
time: 238ms
memory: 308884kb
input:
50000 2 44045 29783 5389 7756 44022 45140 21967 5478 10868 49226 21775 31669 49836 13511 46116 14229 27206 31168 37389 3158 10658 41154 14635 18526 40540 6451 23197 46719 30593 13517 8604 46666 39189 43746 12778 3684 3194 36979 43020 14652 19549 31178 17144 27177 44336 2849 40220 11751 41993 32209 4...
output:
233026182
result:
wrong answer expected '310780127', found '233026182'