簡易テトリスで安心した。大体ビットを使って表現。
なんとなくサイズ5の縦棒が大量にきた場合も溢れないように、配列のサイズ5000くらいにした。
bitはビットが立ってる本数を数える関数。最下位が63なのは消えない番兵として。
#include <iostream> #include <vector> using namespace std; int bit(int bits) { bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555); bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333); bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f); bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff); return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff); } int main(){ int n,a,b,c,mask,ret; while(cin >> n && n){ vector<int> data(5001,0); data[5000] = 63; ret = 0; while(n--){ cin >> a >> b >> c; c--; if(a==1){ mask = ( (1<<b)-1 ) << c; for(int i=0;i+1<data.size();i++){ if(data[i+1] & mask){ data[i] += mask; break; } } }else{ mask = 1 << c; for(int i=0;i+1<data.size();i++){ if(data[i+1] & mask){ for(int j=0;j<b;j++) data[i-j]+=mask; break; } } } vector<int>::iterator it = data.begin(); while(it != data.end()){ if((*it) == 31){ it = data.erase(it); it--; } it++; } } for(int i=0;i<data.size()-1;i++){ ret += bit( data[i] ); } cout << ret << endl; } }